home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 March / PCWorld_2001-03_cd.bin / Software / TemaCD / classbuild / ClassBuilder 2.2 PR405 Setup.exe / {app} / Include / CB_CriticalUniqueValueTree.h < prev    next >
C/C++ Source or Header  |  2000-04-06  |  13KB  |  346 lines

  1. #ifndef CB_CRITICAL_UNIQUEVALUETREE_H
  2. #define CB_CRITICAL_UNIQUEVALUETREE_H
  3.  
  4. #include <assert.h>
  5.  
  6. #include "CB_CriticalSection.h"
  7. #include "CB_UNIQUEVALUETREE.h"
  8.  
  9. // defines for include files
  10. #define RELATION_TEMPLATE_CRITICAL_UNIQUEVALUETREE_ACTIVE(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  11. private:\
  12.     ClassTo* _first##NameTo;\
  13.     int _count##NameTo;\
  14. \
  15. public:\
  16.     static CriticalSection& CriticalSection##NameTo()\
  17.     {\
  18.         static CriticalSection criticalSection##NameTo;\
  19.         return criticalSection##NameTo;\
  20.     }\
  21. \
  22.     void Add##NameTo(ClassTo* item)\
  23.     {\
  24.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  25.         METHOD_UNIQUEVALUETREE_ADD(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  26.     }\
  27.     void Remove##NameTo(ClassTo* item)\
  28.     {\
  29.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  30.         METHOD_UNIQUEVALUETREE_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  31.     }\
  32.     void RemoveAll##NameTo()\
  33.     {\
  34.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  35.         METHOD_UNIQUEVALUETREE_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  36.     }\
  37.     void DeleteAll##NameTo()\
  38.     {\
  39.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  40.         METHOD_UNIQUEVALUETREE_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  41.     }\
  42.     void Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  43.     {\
  44.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  45.         METHOD_UNIQUEVALUETREE_REPLACE(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  46.     }\
  47.     ClassTo* GetFirst##NameTo() const\
  48.     {\
  49.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  50.         METHOD_UNIQUEVALUETREE_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  51.     }\
  52.     ClassTo* GetLast##NameTo() const\
  53.     {\
  54.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  55.         METHOD_UNIQUEVALUETREE_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  56.     }\
  57.     ClassTo* GetNext##NameTo(ClassTo* pos) const\
  58.     {\
  59.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  60.         METHOD_UNIQUEVALUETREE_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  61.     }\
  62.     ClassTo* GetPrev##NameTo(ClassTo* pos) const\
  63.     {\
  64.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  65.         METHOD_UNIQUEVALUETREE_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  66.     }\
  67.     int Get##NameTo##Count() const\
  68.     {\
  69.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  70.         METHOD_UNIQUEVALUETREE_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  71.     }\
  72.     ITERATOR_TEMPLATE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  73.  
  74. #define RELATION_TEMPLATE_NOFILTER_CRITICAL_UNIQUEVALUETREE_ACTIVE(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  75. private:\
  76.     ClassTo* _first##NameTo;\
  77.     int _count##NameTo;\
  78. \
  79. public:\
  80.     static CriticalSection& CriticalSection##NameTo()\
  81.     {\
  82.         static CriticalSection criticalSection##NameTo;\
  83.         return criticalSection##NameTo;\
  84.     }\
  85. \
  86.     void Add##NameTo(ClassTo* item)\
  87.     {\
  88.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  89.         METHOD_UNIQUEVALUETREE_ADD(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  90.     }\
  91.     void Remove##NameTo(ClassTo* item)\
  92.     {\
  93.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  94.         METHOD_UNIQUEVALUETREE_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  95.     }\
  96.     void RemoveAll##NameTo()\
  97.     {\
  98.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  99.         METHOD_UNIQUEVALUETREE_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  100.     }\
  101.     void DeleteAll##NameTo()\
  102.     {\
  103.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  104.         METHOD_UNIQUEVALUETREE_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  105.     }\
  106.     void Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  107.     {\
  108.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  109.         METHOD_UNIQUEVALUETREE_REPLACE(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  110.     }\
  111.     ClassTo* GetFirst##NameTo() const\
  112.     {\
  113.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  114.         METHOD_UNIQUEVALUETREE_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  115.     }\
  116.     ClassTo* GetLast##NameTo() const\
  117.     {\
  118.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  119.         METHOD_UNIQUEVALUETREE_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  120.     }\
  121.     ClassTo* GetNext##NameTo(ClassTo* pos) const\
  122.     {\
  123.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  124.         METHOD_UNIQUEVALUETREE_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  125.     }\
  126.     ClassTo* GetPrev##NameTo(ClassTo* pos) const\
  127.     {\
  128.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  129.         METHOD_UNIQUEVALUETREE_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  130.     }\
  131.     int Get##NameTo##Count() const\
  132.     {\
  133.         CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  134.         METHOD_UNIQUEVALUETREE_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  135.     }\
  136.     ITERATOR_TEMPLATE_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  137.  
  138. #define RELATION_CRITICAL_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  139. private:\
  140.     ClassTo* _first##NameTo;\
  141.     int _count##NameTo;\
  142. \
  143. public:\
  144.     static CriticalSection _criticalSection##NameTo;\
  145.     static CriticalSection& CriticalSection##NameTo() { return _criticalSection##NameTo; }\
  146. \
  147.     void Add##NameTo(ClassTo* item);\
  148.     void Remove##NameTo(ClassTo* item);\
  149.     void RemoveAll##NameTo();\
  150.     void DeleteAll##NameTo();\
  151.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  152.     ClassTo* GetFirst##NameTo() const;\
  153.     ClassTo* GetLast##NameTo() const;\
  154.     ClassTo* GetNext##NameTo(ClassTo* pos) const;\
  155.     ClassTo* GetPrev##NameTo(ClassTo* pos) const;\
  156.     int Get##NameTo##Count() const;\
  157.     ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  158.  
  159. #define RELATION_NOFILTER_CRITICAL_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  160. private:\
  161.     ClassTo* _first##NameTo;\
  162.     int _count##NameTo;\
  163. \
  164. public:\
  165.     static CriticalSection _criticalSection##NameTo;\
  166.     static CriticalSection& CriticalSection##NameTo() { return _criticalSection##NameTo; }\
  167. \
  168.     void Add##NameTo(ClassTo* item);\
  169.     void Remove##NameTo(ClassTo* item);\
  170.     void RemoveAll##NameTo();\
  171.     void DeleteAll##NameTo();\
  172.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  173.     ClassTo* GetFirst##NameTo() const;\
  174.     ClassTo* GetLast##NameTo() const;\
  175.     ClassTo* GetNext##NameTo(ClassTo* pos) const;\
  176.     ClassTo* GetPrev##NameTo(ClassTo* pos) const;\
  177.     int Get##NameTo##Count() const;\
  178.     ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  179.  
  180. #define RELATION_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  181. public:\
  182.     ClassFrom* _ref##NameFrom;\
  183.     ClassTo* _parent##NameFrom;\
  184.     ClassTo* _left##NameFrom;\
  185.     ClassTo* _right##NameFrom;\
  186. \
  187. public:\
  188.     ClassFrom* Get##NameFrom() const { return _ref##NameFrom; };
  189.  
  190. // defines implementation
  191. #define INIT_CRITICAL_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  192. {\
  193.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  194.     INIT_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  195. }
  196.  
  197. #define EXIT_CRITICAL_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  198. {\
  199.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  200.     EXIT_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  201. }
  202.  
  203. #define REPLACE_CRITICAL_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  204. {\
  205.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  206.     REPLACE_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  207. }
  208.  
  209. #define INIT_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  210. {\
  211.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  212.     INIT_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  213. }
  214.  
  215. #define EXIT_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  216. {\
  217.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  218.     EXIT_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  219. }
  220.  
  221. #define REPLACE_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  222. {\
  223.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  224.     REPLACE_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  225. }
  226.  
  227. #define REMOVE_CRITICAL_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  228. {\
  229.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  230.     REMOVE_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  231. }
  232.  
  233. #define SAVE_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  234. {\
  235.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  236.     SAVE_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  237. }
  238.  
  239. #define RESTORE_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  240. {\
  241.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  242.     RESTORE_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  243. }
  244.  
  245. #define REMOVE_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  246. {\
  247.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  248.     REMOVE_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  249. }
  250.  
  251. #define CLEANUP_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  252. {\
  253.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  254.     CLEANUP_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  255. }
  256.  
  257. #define METHODS_CRITICAL_UNIQUEVALUETREE_ACTIVE(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  258.     CriticalSection ClassFrom##::_criticalSection##NameTo;\
  259. void ClassFrom##::Add##NameTo(ClassTo* item)\
  260. {\
  261.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  262.     METHOD_UNIQUEVALUETREE_ADD(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  263. }\
  264. \
  265. void ClassFrom##::Remove##NameTo(ClassTo* item)\
  266. {\
  267.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  268.     METHOD_UNIQUEVALUETREE_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  269. }\
  270. \
  271. void ClassFrom##::RemoveAll##NameTo()\
  272. {\
  273.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  274.     METHOD_UNIQUEVALUETREE_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  275. }\
  276. \
  277. void ClassFrom##::DeleteAll##NameTo()\
  278. {\
  279.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  280.     METHOD_UNIQUEVALUETREE_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  281. }\
  282. \
  283. void ClassFrom##::Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  284. {\
  285.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  286.     METHOD_UNIQUEVALUETREE_REPLACE(member, ClassFrom, NameFrom, ClassTo, NameTo) \
  287. }\
  288. \
  289. ClassTo* ClassFrom##::GetFirst##NameTo() const\
  290. {\
  291.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  292.     METHOD_UNIQUEVALUETREE_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  293. }\
  294. \
  295. ClassTo* ClassFrom##::GetLast##NameTo() const\
  296. {\
  297.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  298.     METHOD_UNIQUEVALUETREE_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  299. }\
  300. \
  301. ClassTo* ClassFrom##::GetNext##NameTo(ClassTo* pos) const\
  302. {\
  303.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  304.     METHOD_UNIQUEVALUETREE_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  305. }\
  306. \
  307. ClassTo* ClassFrom##::GetPrev##NameTo(ClassTo* pos) const\
  308. {\
  309.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  310.     METHOD_UNIQUEVALUETREE_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  311. }\
  312. \
  313. int ClassFrom##::Get##NameTo##Count() const\
  314. {\
  315.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  316.     METHOD_UNIQUEVALUETREE_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  317. }
  318.  
  319. #define METHODS_CRITICAL_UNIQUEVALUETREE_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  320.  
  321. #define BODY_CRITICAL_UNIQUEVALUETREE_FIND(member, value, ClassFrom, NameFrom, ClassTo, NameTo) \
  322. {\
  323.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  324.     BODY_UNIQUEVALUETREE_FIND(member, value, ClassFrom, NameFrom, ClassTo, NameTo) \
  325. }
  326.  
  327. #define BODY_CRITICAL_UNIQUEVALUETREE_FINDREVERSE(member, value, ClassFrom, NameFrom, ClassTo, NameTo) \
  328. {\
  329.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  330.     BODY_UNIQUEVALUETREE_FINDREVERSE(member, value, ClassFrom, NameFrom, ClassTo, NameTo) \
  331. }
  332.  
  333. #define WRITE_CRITICAL_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  334. {\
  335.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  336.     WRITE_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  337. }
  338.  
  339. #define READ_CRITICAL_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  340. {\
  341.     CriticalSectionLock lock(ClassFrom::CriticalSection##NameTo());\
  342.     READ_UNIQUEVALUETREE_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  343. }
  344.  
  345. #endif
  346.